package com.tqyan.start.controller;

import com.tqyan.model.Result;
import com.tqyan.model.controller.request.UserRequest;
import com.tqyan.model.controller.response.UserResp;
import com.tqyan.model.dto.WechatUserDTO;
import com.tqyan.service.chat.ChatPointContent;
import com.tqyan.service.service.ChatChatService;
import com.tqyan.service.service.UserService;
import com.tqyan.service.transfer.LimitService;
import com.tqyan.service.transfer.WechatService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @description 微信API
 * <p> <功能详细描述> </p>
 *
 * @author 陈晨
 * @date 2023/4/11 17:20
 */
@RestController
@RequestMapping("/wechat")
@Slf4j
//@Api(tags = "微信API")
public class WechatController {

    @Autowired
    private WechatService wechatService;
    @Autowired
    private UserService userService;
    @Autowired
    private LimitService limitService;
    @Autowired
    private ChatChatService chatChatService;

//    @Autowired
//    private AccountService accountService;
//    private WxPayService wxPayService = new WxPayServiceImpl();
//    private static final String callBackURL="/wechat/payment-notify";
//    private static final String mchId="1547441881";
//    private static final String mchKey="Shutan12345678901234567890Shutan";



    @PostMapping("/getUserInfo")
//    @ApiOperation(value = "微信用户信息")
    public Result<UserResp> getUserInfo(@RequestBody UserRequest userRequest) {
        if (null == userRequest
                || StringUtils.isBlank(userRequest.getJsCode())) {
            return Result.fail("请求参数不可为空");
        }
        log.info("[微信] userRequest={}, 微信用户信息", userRequest);
        boolean isLock = limitService.lock(userRequest.getJsCode());
        if (!isLock) {
            return Result.fail("让小燕子休息一会吧");
        }
        try {
            // 微信登录
            WechatUserDTO wechatUser = wechatService.getWechatUserInfo(userRequest.getJsCode());
            wechatUser.setFace(userRequest.getFace());
            wechatUser.setNickname(userRequest.getNickname());
            wechatUser.setReference(userRequest.getReference());
            // 用户登录
            UserResp userResp = userService.wechatLogin(wechatUser);
            // 登录成功
            if (userResp.getIsRegister()) {
                // 添加"指令"
                chatChatService.chat(userResp.getOpenId(), null, ChatPointContent.POINT);

//                // 添加"至用户的一封信"
//                ChatContentResp chatResp = chatChatService.chat(userResp.getOpenId(), null, ChatPointService.USER_LETTER);
//                // 添加"指令"
//                chatChatService.chat(userResp.getOpenId(), Long.parseLong(chatResp.getChatId()), ChatPointService.POINT);
            }
            return Result.success(userResp);
        } catch (Exception e) {
            log.error("[微信] userRequest={}, 微信用户信息, 异常: {}"
                    , userRequest, e.getMessage(), e);
            return Result.fail(e.getMessage());
        } finally {
            limitService.unlock(userRequest.getJsCode());
        }
    }

//    @PostMapping("/pay")
//    public WxPayMpOrderResult pay(@RequestBody RechargeRequest rechargeRequest) {
//        // 校验金额
//        if (rechargeRequest.getAmount() == null || rechargeRequest.getAmount().doubleValue() <= 0) {
//            throw new IllegalArgumentException("Invalid recharge amount");
//        }
//
//        // 创建预支付订单
//        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
//        orderRequest.setBody("充值");
//        orderRequest.setOutTradeNo("recharge-" + System.currentTimeMillis()); // 设置订单号，建议根据实际业务生成唯一订单号
//        orderRequest.setTotalFee(rechargeRequest.getAmount().multiply(new BigDecimal(100)).intValue()); // 单位：分
//        orderRequest.setSpbillCreateIp("123.12.12.123"); // 设置支付IP，可根据实际情况获取用户的IP地址
//        orderRequest.setNotifyUrl("https://yourserver.com/api/wechat/pay/notify"); // 设置支付回调URL，替换为你的后端服务器地址
//        orderRequest.setTradeType("JSAPI");
//        orderRequest.setOpenid(rechargeRequest.getOpenId()); // 设置用户的openid，需从前端传递
//
//        try {
//            WxPayUnifiedOrderResult unifiedOrderResult = wxPayService.unifiedOrder(orderRequest);
//            // 从预支付订单结果中获取必要的参数，返回给前端
//            WxPayMpOrderResult mpOrderResult = wxPayService.createOrderResult(unifiedOrderResult);
//            return mpOrderResult;
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new RuntimeException("Failed to create prepay order", e);
//        }
//    }

//    @PostMapping("/pay")
//    public WxPayUnifiedOrderResult recharge(@RequestBody RechargeRequest rechargeRequest, HttpServletRequest request) {
//        log.info("[微信] rechargeRequest={}, 微信用户支付", rechargeRequest);
//        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
//        orderRequest.setBody("充值");
//        // 生成一个唯一的订单号
//        orderRequest.setOutTradeNo("RE" + GuidUtil.getUUID());
//        orderRequest.setTotalFee(rechargeRequest.getTotalFee());
//        orderRequest.setFeeType("CNY");
//        // 客户端的IP地址
//        orderRequest.setSpbillCreateIp(this.getClientIpAddress(request));
//        // 支付成功后的回调URL
//        orderRequest.setNotifyUrl(rechargeRequest.getDomain() + callBackURL);
//        orderRequest.setTradeType("JSAPI");
//        orderRequest.setOpenid(rechargeRequest.getOpenId());
////        orderRequest.setMchId(mchId);
////        orderRequest.setSubMchId(mchId);
//        try {
//            return wxPayService.unifiedOrder(orderRequest);
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new RuntimeException("创建微信支付订单失败", e);
//        }
//    }

//    private String getClientIpAddress(HttpServletRequest request) {
//        String ipAddress = request.getHeader("X-Forwarded-For");
//        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
//            ipAddress = request.getHeader("Proxy-Client-IP");
//        }
//        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
//            ipAddress = request.getHeader("WL-Proxy-Client-IP");
//        }
//        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
//            ipAddress = request.getRemoteAddr();
//        }
//        return ipAddress;
//    }

//    @PostMapping("/payment-notify")
//    public String paymentNotify(@RequestBody String xmlData) {
//        log.info("[微信] rechargeRequest={}, 微信用户支付回调", xmlData);
//        // 1. 解析微信支付回调通知的 XML 数据
//        WxPayOrderNotifyResult notifyResult;
//        try {
//            notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
//        } catch (Exception e) {
//            log.error("[微信支付] xmlData={}, 回调对象解析异常: {}", xmlData, e.getMessage(), e);
//            return WxPayNotifyResponse.fail("支付处理失败");
//        }
//        // 已支付
//        if (!limitService.isPay(notifyResult.getTransactionId())) {
//            return WxPayNotifyResponse.fail("OK");
//        }
//        // 添加处理锁
//        String key = notifyResult.getOpenid() + ":" + notifyResult.getTransactionId();
//        if (!limitService.lock(key)) {
//            return WxPayNotifyResponse.fail("支付处理中");
//        }
//        try {
//            // 查询用户信息
//            UserDTO user = userService.getUserInfo(notifyResult.getOpenid());
//            if (null == user) {
//                log.error("[微信支付] xmlData={}, 用户信息不存在", xmlData);
//                return WxPayNotifyResponse.fail("支付处理失败");
//            }
//
//            // 2. 验证签名，确保通知是从微信支付发出的
//            // WxPayService 已在解析过程中验证签名
//
//            // 3. 检查支付结果是否为成功
//            if ("SUCCESS".equalsIgnoreCase(notifyResult.getReturnCode()) && "SUCCESS".equalsIgnoreCase(notifyResult.getResultCode())) {
////                // 支付成功，处理您的业务逻辑，如更新订单状态、记录支付信息等
////                String transactionId = notifyResult.getTransactionId(); // 微信支付订单号
////                String outTradeNo = notifyResult.getOutTradeNo(); // 商户订单号
////                Integer totalFee = notifyResult.getTotalFee(); // 订单金额（分）
//                // 在这里更新您的订单状态、记录支付信息等
//                accountService.recharge(user.getId(), notifyResult.getTotalFee(), JSONObject.toJSONString(notifyResult));
//                // 标记支付完成
//                limitService.setIsPay(notifyResult.getTransactionId());
//                log.info("[微信支付] xmlData={}, 标记支付完成", xmlData);
//                // 4. 返回响应给微信支付，表明已接收到通知
//                return WxPayNotifyResponse.success("OK");
//            } else {
//                // 支付失败，处理您的业务逻辑，如记录失败原因等
//                log.error("[微信支付] xmlData={}, 支付失败", xmlData);
//                // 返回响应给微信支付，表明已接收到通知，但支付失败
//                return WxPayNotifyResponse.fail("支付失败");
//            }
//        } catch (Exception e) {
//            // 解析通知数据或验证签名失败，处理您的业务逻辑，如记录失败原因等
//            log.error("[微信支付] xmlData={}, 支付处理异常: {}", xmlData, e.getMessage(), e);
//            // 返回响应给微信支付，表明已接收到通知，但处理失败
//            return WxPayNotifyResponse.fail("支付处理失败");
//        } finally {
//            // 释放处理锁
//            limitService.unlock(key);
//        }
//    }

}


